Pourquoi utiliser des fonctions

Les fonctions permettent d'viter la rptition de code dans nos programmes.

En crant des fonctions, on va ainsi pouvoir r-utiliser certains morceaux de code et mme, grce aux paramtres, obtenir diffrents rsultats en fonction des arguments envoys.

La syntaxe

Pour crer une fonction, on la dclare avec l'instruction def, suivie du nom de la fonction, de parenthses, et de deux points :

def ma_fonction():

Mme si vous ne mettez rien l'intrieur des parenthses pour le moment, vous tes obligs de les mettre.

Une fonction ne peut cependant pas tre vide, au minimum, vous devrez donc indiquer une ligne de code dans un bloc d'instruction contenu l'intrieur de votre fonction. Si vous ne savez pas encore ce que votre fonction va contenir, vous pouvez utiliser l'instruction pass :

def ma_fonction():
    pass

Retourner une valeur

Pour retourner une valeur dans une fonction, on utilise l'instruction return.

Une fonction n'est pas oblige de retourner une valeur ! Vous pouvez trs bien crer des fonctions qui excutent une action et ne retournent rien (par dfaut, la valeur None sera tout de mme retourne si vous ne mettez aucune instruction return).

Vous pouvez galement retourner plusieurs valeurs en les sparant par une virgule, par exemple :

def foo():
    return 5, 10

Les paramtres et les arguments

Attention la nomenclature ici, les mots paramtres et arguments sont bien souvent utiliss tort et travers dans de nombreux  tutoriels que vous trouverez en ligne. Mais il existe bien une diffrence entre les deux :

Prenons un exemple :

def addition(a, b):
    return a + b

addition(a=5, b=10)

Dans le code ci-dessus, vous tablissez deux paramtres, a et b, dans la dfinition de la fonction :

def addition(a, b):

Ensuite, vous envoyez comme argument respectivement les valeurs 5 et 10 aux paramtres a et b.

Les paramtres que vous dfinissez peuvent avoir des valeurs par dfaut. Cela vous permet de ne pas forcment envoyer d'argument lorsque vous appelez votre fonction :

def addition(a=1, b=1):
    return a + b

addition()  # 2

La fonction ci-dessus peut-tre appele sans envoyer aucune valeur en argument et elle retournera 2 (1 + 1) en utilisant les valeurs par dfaut dfinis dans la dfinition de la fonction.

Si un paramtre n'a pas de valeur par dfaut, vous devez absolument lui envoyer une valeur en argument, faute de quoi Python vous retournera une erreur :

def addition(a, b=2):
    return a + b

addition(b=5)  # TypeError: addition() missing 1 required positional argument: 'a'

Notez galement qu'il n'est pas possible de dfinir un paramtre sans valeur par dfaut aprs un paramtre avec une valeur par dfaut.

def addition(a=1, b):
   return a + b

# SyntaxError: non-default argument follows default argument

Dans ce cas-ci, vous avez trois options : ajouter une valeur par dfaut au paramtre b, enlever la valeur par dfaut au paramtre a, ou bien placer le paramtre a et sa valeur par dfaut aprs le paramtre b :

def addition(a=1, b=2):  # Valide
def addition(a, b):  # Valide
def addition(b, a=1):  # Valide

Espaces global et local

La notion d'espace global et local est trs importante et souvent peu comprise par les dbutants qui prfrent ne pas se prendre la tte avec tout a.

Pourtant, cela peut nous jouer de trs mauvais tours si on ne comprend pas ce qu'est un espace local.

Quand vous dfinissez une fonction, vous dfinissez un espace local la fonction.

Cela signifie que toutes les variables dfinies l'intrieur de cette fonction ne seront pas disponibles en dehors de la fonction :

def foo():
    a = 5

print(a)  # NameError: name 'a' is not defined

La variable a dfinie l'intrieur de la fonction n'est pas accessible en dehors de la fonction.

Vous avez par contre accs l'intrieur d'une fonction une variable dfinie dans l'espace global de votre script :

a = 5

def foo():
    print(a)

foo()

Le code suivant affichera bien la valeur de a et vous n'aurez pas d'erreur.

Attention cependant : ds que vous crez une variable l'intrieur d'une fonction, cette variable devient local la fonction et ne modifiera donc pas la variable global :

a = 5

def foo():
    a = 10
    print(a)

foo()
print(a)

Dans ce code, on cre une variable a dans la fonction qui est donc diffrente de la variable a dfinie dans l'espace globale.

Ce script affichera donc 10 (la valeur de a dans la fonction foo que l'on appelle) puis 5 (la valeur de a dans l'espace global, qui n'a donc pas t modifie).